/** 类型 */
enum Etype {
    // ========================== typeof 可以区分的值 ============================ //
    undefined = 'undefined',
    symbol = 'symbol',
    bigint = 'bigint',
    number = 'number',
    boolean = 'boolean',
    string = 'string',
    function = 'function',
    // ========================== 其它全都是 typeof === 'object'， 需要使用其它方式区分。  ============================ //

    // ============= obj === null ============= //
    null = 'null',

    // ============= obj === DEFAULT ============= //
    DEFAULT = 'DEFAULT',

    // ============= typeof obj.constructor === 'undefined' ============= //
    NULLOBJ = 'Object.create(null)',

    // ============= obj.constructor === Object ============= //
    obj = 'obj',// 该类型是普通js对象，不是所有类型。

    // ============= Array.isArray(obj) ============= //
    array = 'array',

    // ========================== 以下需要对详细类型进行特殊处理  ============================ //
    // ============= obj instanceof HTMLElement ============= //
    // typeof                           => 'object'
    // constructor.name                 => 'HTML***Element'
    // Object.prototype.toString.call   => '[object HTML***Element]'
    HTMLElement = 'HTMLElement',

    KHTMLElement = 'KHTMLElement',// 对 HTMLElement 和 NodeList 的包装类型

    // ========================== 以下无需对详细类型进行特殊处理的，无需再进行区分，都使用 obj.constructor.name。  ============================ //
    NodeList = 'NodeList',
    Map = 'Map',
    Set = 'Set',
    WeakMap = 'WeakMap',
    RegExp = 'RegExp',

    // 不常用类型，或项目中的自定义类型，不做定义。
};

/** 确定的详细类型 */
enum Etypedetail {
    // undefined
    undefined = 'undefined',

    // symbol
    symbol = 'symbol',

    // bigint
    bigint_zero = 'BigInt0',
    bigint_positive = 'BigInt',
    bigint_negative = '-BigInt',

    // number
    number_NaN = 'NaN',
    number_positive_Infinity = 'Infinity',
    number_negative_Infinity = '-Infinity',
    number_zero = '0',
    number_positive_Integer = 'Integer',
    number_negative_Integer = '-Integer',
    number_positive_Decimal = 'Decimal',
    number_negative_Decimal = '-Decimal',

    // boolean
    boolean_true = 'true',
    boolean_false = 'false',

    // string
    string = 'string',
    string_empty = 'empty string',
    string_blank = 'blank string',

    // function
    function = 'function',

    // null
    null = 'null',

    // 默认值
    DEFAULT = 'DEFAULT',

    // nullobj
    NULLOBJ = 'Object.create(null)',

    // obj
    obj = 'obj',
    obj_empty = 'empty obj',

    // array
    array = 'array',
    array_empty = 'empty array',

    // 'HTML***Element',
}

/** 类型返回值类型 */
type Ttypeof = Etype;// 还有其它未加入枚举值中的字符串，此处不做处理。
/** 详细类型返回值类型 */
type Ttypeof_detail = { type: Ttypeof, detail: Etypedetail };// 还有其它未加入枚举值中的字符串，此处不做处理。
